#pragma once
#include <iostream>
#include <string>
#include <vector>
#include "log.hpp"
#include "InetAddr.hpp"
#include"Mutex.hpp"

using namespace LogModule;
using namespace MutexNamespace;

class Route
{

private:
    // 判断用户是否存在
    bool IsExit(InetAddr &peer)
    {
        for (auto &x : _online_user)
        {
            if (x == peer)
                return true;
        }

        return false;
    }
    // 首次通信添加用户信息
    void AddUser(InetAddr &peer)
    {
        LOG(LogLevel::INFO) << "新增加一个在线用户" << peer.StringAddr();
        _online_user.push_back(peer);
    }

    // 删除用户信息
    void EraseUser(InetAddr &peer)
    {
        auto it = _online_user.begin();
        while (it != _online_user.end())
        {
            if (*it == peer)
            {
                LOG(LogLevel::INFO) << "删除一个在线用户" << peer.StringAddr() << "成功";
                _online_user.erase(it);
                break;
            }
            it++;
        }
    }

public:
    Route()
    {
    }
    ~Route()
    {
    }

    // 消息转发
    void MessageRoute(int sockfd, const std::string &Message, InetAddr &peer)
    {
        LockGuard lock(_mutex);
        //std::cout<<Message<<std::endl;
        // 判断用户是否存在
        if (!IsExit(peer))
        {
            // 添加用户
            AddUser(peer);
        }

        std::string send_message = peer.StringAddr() + "#" + Message;
        for (auto &x : _online_user)
        {
            sendto(sockfd, send_message.c_str(), send_message.size(), 0, (const struct sockaddr *)&x.GetAddr(), sizeof(x.GetAddr()));
        }

        // 判断用户是否进行退出请求
        if (Message == "QUIT")
        {
            LOG(LogLevel::INFO) << "删除一个在线用户" << peer.StringAddr();
            EraseUser(peer);
        }
    }

private:
    std::vector<InetAddr> _online_user;
    Mutex _mutex;
};
